//package com.example.demo.service.lmp;
//
//import com.example.demo.Request.DifferOrder;
//import com.example.demo.Request.LogEntity;
//import com.example.demo.Request.OrderModificationRequest;
//import com.example.demo.exception.BusinessException;
//import com.example.demo.exception.ExceptionCode;
//import com.example.demo.mapper.OrderMapper;
//import com.example.demo.model.Item;
//import com.example.demo.model.ModifyType;
//import com.example.demo.model.Order;
//import com.example.demo.model.OrderStatus;
//import com.example.demo.service.IOrderService;
//import com.example.demo.service.OrderChangeService;
//import com.example.demo.util.ItemUtil;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import java.time.LocalDateTime;
//import java.util.*;
//
//@Service
//public class OrderChangeServiceImpl implements OrderChangeService {
//
//    @Autowired
//    OrderMapper orderMapper;
//    @Autowired
//    OrderChangeService orderChangeService;
//    @Autowired
//    IOrderService orderService;
//
//
//    private Map<String,Order> orderMap =new HashMap<>();
//
//    //修改订单
//    @Override
//    public Order modifyOrder(String orderId, OrderModificationRequest request, boolean isOK) {
//      //找到旧的订单
//        Order order =orderMapper.findById(orderId);
//        //判断订单是否为空
//         if(Objects.isNull(order)){
//             throw new BusinessException(ExceptionCode.ORDER_NOT_FOUND);
//         }
//         OrderStatus oldOrderStatus =order.getStatus();
//         //如果订单不等于未支付
//         if(OrderStatus.CREATE.equals(oldOrderStatus)){
//             //抛出该订单已支付，不能够修改
//             throw new BusinessException(ExceptionCode.MODIFY_FORBIDDEN);
//         }
//         //校验商品有效性
//        //getAllItems()获得菜单(所有商品)
//        List<Item> menu = ItemUtil.getAllItems();
//         //containsAll检查menu是否包含request.getNewItems()得到的所有商品列表
//        //将menu里面的商品添加到HashSet集合
//         if(!new HashSet<>(menu).containsAll(request.getNewItems())){
//             //商品失效
//             throw new BusinessException(ExceptionCode.ITEM_INVALID);
//         }
//
//         //存入旧的的订单商品
//        List<Item>  orderItems= new ArrayList<>(order.getItems());
//
//         //差异单
//        DifferOrder differOrder =new DifferOrder(orderId,order.getItems(),order.getTotalPrice(),request.getModifyType());
//
//        //处理不同类型的修改
//        switch (request.getModifyType()) {
//            case FULL_REPLACE://整单替换
//                //处理整单替换逻辑
//                //替换掉所有商品
//                order.setItems(request.getNewItems());
//                break;
//            case ADD_ITEM: //新增商品
//                //获得原来商品并且把新的商品加进去
//                List<Item> add = order.getItems();
//                add.addAll(request.getNewItems());
//                break;
//            case REMOVE_ITEM://删除
//                List<Item> delete = order.getItems();
//                delete.removeAll(request.getNewItems());
//                break;
//            case CHANGE_QUANTITY://修改数量
//                break;
//            default:
//                throw new IllegalArgumentException("Invalid modify  type");
//
//        }
//
//        //判断
//        if(isOK){
//            //同意修改
//            //设置修改时间
//            order.setCreateTime(LocalDateTime.now());
//            //订单状态修改为重新下单
//            order.setStatus(OrderStatus.REPEAT);
//        }else {
//            //不同意，则修改失败，还原商品
//            order.setItems(orderItems);
//        }
//
//        //重新计算总价
//        double totalPrice =orderService.createOrder(order.getItems(),false);
//      order.setTotalPrice(totalPrice);
//
//      //补全差异单
//        differOrder.setItems(order.getItems());
//        differOrder.setTotalPrice(order.getTotalPrice());
//
//
//        //构建日志
//        LogEntity logEntity =new LogEntity(LocalDateTime.now(),differOrder);
//        logEntity.setAgree(isOK);//同意
//
//        // 8. 执行修改
//        Order updatedOrder = orderMapper.save(order);
//
//        // 9. 记录操作日志
//        orderMapper.logModification(orderId, logEntity);
//
//        return orderMapper.findById(order.getOrderId());
//    }
//
//
//
//}
